import {
  Disposable,
  ICommandService,
  IUniverInstanceService,
  Workbook,
} from '@univerjs/core';
import {
  IInsertRecordCommandParams,
  InsertRecordCommand,
} from '../commands/insert-record.command.js';

const STORES = ['王府井店', '浦东1店', '浦东2店'];
const BOOKS = [
  'JavaScript 高级程序设计',
  'CSS 权威指南',
  'HTML5 权威指南',
  'Python 编程快速上手',
  'Java 编程思想',
  'C++ Primer',
  '深入理解计算机系统',
  '算法导论',
  '数据结构与算法分析',
  '操作系统概念',
  '人月神话',
  'Head First 设计模式',
  'JavaScript 高级编程',
];

export class UpdateSalesController extends Disposable {
  private _updateTimer: NodeJS.Timeout | null = null;

  constructor(
    // 请注意，我们这里使用了装饰器语法
    // 通过依赖注入容器来获取想要的依赖
    // 引入了 IUniverInstanceService 来管理 Univer 实例中的文档
    @IUniverInstanceService
    private readonly _univerInstanceService: IUniverInstanceService,
    // 引入 ICommandService 来执行命令
    @ICommandService private readonly _commandService: ICommandService,
  ) {
    super();

    this._init();
  }

  // 在 Univer 中，管理模块销毁的方式是通过继承 Disposable 类，并重写 dispose 方法
  override dispose(): void {
    super.dispose();

    if (this._updateTimer) {
      clearInterval(this._updateTimer);
      this._updateTimer = null;
    }
  }

  private _registerCommands(): void {
    // 通过 disposeWithMe 方法注册命令，这样在 UpdateSalesController 销毁时会自动注销命令
    this.disposeWithMe(
      this._commandService.registerCommand(InsertRecordCommand),
    );
  }

  private _init(): void {
    this._registerCommands();

    this.disposeWithMe(
      // 订阅 Univer 实例的 unitAdded$ 事件，即有新的 Workbook 实例被添加时触发
      // 通过 disposeWithMe 方法注册订阅，这样在 UpdateSalesController 销毁时会自动取消订阅
      this._univerInstanceService.unitAdded$.subscribe((unit) => {
        // 确保 unit 是 Workbook 实例
        if (!(unit instanceof Workbook)) return;

        const workbook = unit as Workbook;

        this._updateTimer = setInterval(() => {
          // 执行一个自定义命令
          this._commandService.executeCommand<IInsertRecordCommandParams>(
            InsertRecordCommand.id,
            {
              workbookId: workbook.getUnitId(),
              bookName: BOOKS[Math.floor(Math.random() * BOOKS.length)],
              store: STORES[Math.floor(Math.random() * STORES.length)],
              quantity: Math.floor(Math.random() * 100),
              price: Math.floor(Math.random() * 100) + 1,
            },
          );
        }, 5_000);
      }),
    );
  }
}
